iT邦幫忙

2025 iThome 鐵人賽

DAY 21
0
Rust

用 Tauri 打造你的應用程式系列 第 21

[Day 21] Windows 打包 (二):嵌入外部資源檔案

  • 分享至 

  • xImage
  •  

在實際的應用程式開發中,我們經常需要將一些外部檔案與應用程式一起發布,例如預設的設定檔案、SQLite 資料庫、圖片資源、範本檔案,或是第三方的靜態資產。這些檔案不屬於編譯後的程式碼,但對應用程式的正常運作卻是不可或缺的。Tauri 提供了強大的資源同梱機制,讓我們能夠輕鬆地將這些外部檔案整合到最終的安裝包中。

資源同梱的重要性與應用場景

資源檔案的處理是桌面應用程式開發中的常見需求。想像一個文字編輯器需要預設的範本檔案,或是一個遊戲需要音效檔案和圖片資源,這些檔案都必須隨著應用程式一起發布給使用者。傳統的做法可能需要複雜的安裝腳本或是手動複製檔案,但 Tauri 的資源系統讓這個過程變得簡單且可靠。

透過 Tauri 的資源機制,我們可以確保這些檔案在應用程式安裝時就被正確放置,並且在執行期能夠可靠地存取到它們,而不用擔心路徑問題或是檔案遺失的狀況。

設定資源檔案的包含規則

tauri.conf.json 中,我們可以透過 bundle.resources 欄位來指定要包含的檔案或目錄:

{
  "bundle": {
    "active": true,
    "targets": "all",
    "resources": [
      "assets/config.json",
      "assets/database.db",
      "assets/templates/*",
      "../public/sample.txt"
    ]
  }
}

這個設定支援多種路徑格式。單一檔案可以直接指定路徑,使用 * 可以包含目錄下的所有檔案,而 **/* 則會遞迴包含所有子目錄的內容。路徑是相對於專案根目錄的,所以要確保檔案確實存在於指定的位置。

打包並安裝之後,這些資源就會被放在 $RESOURCE 資料夾中 (維持相同資料夾架構),不同平台對應的 $RESOURCE 位置不同,詳細可以參考這裡

在執行期存取資源檔案

當資源檔案被打包後,我們需要在執行期正確地存取它們。Tauri 提供了專門的 API 來解析資源檔案的路徑:

import { ref, onMounted } from 'vue'
import { resolveResource } from '@tauri-apps/api/path'
import { readTextFile } from '@tauri-apps/api/fs'

const appConfig = ref(null)

onMounted(async () => {
  try {
    // 解析資源檔案的實際路徑
    const configPath = await resolveResource('assets/config.json')
    
    // 讀取檔案內容
    const configData = await readTextFile(configPath)
    const config = JSON.parse(configData)
    
    console.log('載入的設定:', config)
    appConfig.value = config
  } catch (error) {
    console.error('無法載入設定檔:', error)
  }
})

需要注意的是,只要 resolveResource() 內的參數與當初在 tauri.conf.jsonresources 設定的一樣,就可以拿到對應檔案,我們不需要再去處理它在使用者的電腦中的哪一個位置。

在 Rust 後端,我們也可以使用相應的 API 來存取資源:

use tauri::path::BaseDirectory;
use std::fs;

#[tauri::command]
fn load_config(handle: tauri::AppHandle) -> Result<String, String> {
    // 解析資源檔案路徑
    let resource_path = handle.path()
        .resolve("assets/config.json", BaseDirectory::Resource)
        .map_err(|e| e.to_string())?;
    
    // 讀取檔案內容
    let content = fs::read_to_string(resource_path)
        .map_err(|e| e.to_string())?;
    
    Ok(content)
}

實際應用範例與最佳實踐

讓我們以一個實際的例子來說明:假設我們正在開發一個筆記應用程式,需要包含預設的範本檔案。我們可以在專案中建立 assets/templates/ 目錄,放入各種筆記範本,然後在設定中包含這些檔案。

應用程式啟動時,可以載入這些範本並提供給使用者選擇。這樣的設計不僅讓應用程式更加完整,也提供了更好的使用者體驗。使用者如果想要修改範本,或是新增新的範本 (e.g. 從網路上下載),可以直接自行修改或新增檔案。

小結

Tauri 的資源同梱機制為桌面應用程式的檔案管理提供了優雅的解決方案。透過簡單的設定,我們就能將必要的外部檔案與應用程式一同打包發布,並在執行期透過統一的 API 來存取這些資源。這不僅簡化了部署流程,也確保了檔案的可靠性和可維護性。無論是設定檔、資料庫、範本或是其他靜態資源,都能透過這個機制來妥善管理,為使用者提供完整而穩定的應用程式體驗。


上一篇
[Day 20] Windows 打包 (一):基礎
下一篇
[Day 22] Android 打包
系列文
用 Tauri 打造你的應用程式24
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言